home *** CD-ROM | disk | FTP | other *** search
- /* Copyright 1992 H.Ogasawara(COR.) */
-
- #include "proto.h"
-
- /*
- make a packet of data.
- return value is packet size.
- */
- DataPack( block, pack, data, flag )
- unsigned char *pack,
- *data;
- {
- unsigned short i,
- len= flag & 0xfff;
- *pack++= len == 128 ? SOH : STX;
- *pack++= block;
- *pack++= ~block;
- if( flag & 0x8000 ){ /* SUM */
- unsigned short sum;
- for( sum= i= 0 ; i< len ; i++ )
- sum+= (*pack++= *data++);
- *pack++= sum;
- return len+ 4;
- }else{ /* CRC */
- unsigned short crc= CRCTOP;
- for( i= 0 ; i< len ; i++ )
- crc= crc<<8^__crc[crc>>8^(*pack++= *data++)];
- *pack++= crc>>8;
- *pack++= crc&255;
- return len+ 5;
- }
- }
-
- /*
- unpack and error check.
- return value is data size.
- if this routine returned -1, packet got error.
- */
- DataUnpack( len, pack, flag )
- unsigned short len;
- unsigned char *pack;
- {
- unsigned short i;
- if( *pack != ((~pack[1]) & 0xff) )
- return -1;
- pack+= SKIP;
- if( flag ){
- unsigned char sum;
- for( sum= i= 0 ; i< len ; i++ )
- sum+= *pack++;
- if( *pack != sum )
- return -1;
- return len;
- }else{
- unsigned short crc= CRCTOP;
- for( i= 0 ; i< len ; i++ )
- crc= crc<<8^__crc[crc>>8^*pack++];
- if( crc != (*pack << 8)+pack[1] )
- return -1;
- return len;
- }
- }
-
- /*
- make ymodem first data.
- */
- SetFilePacket( buf, name, size, time )
- unsigned char *buf,
- *name;
- unsigned int size,
- time;
- {
- unsigned char *p,
- *s,
- pack[24];
- for( p= buf ; *p++= *name++ ;);
- s= pack+20;
- *s= '\0';
- do{
- *--s= size%10+'0';
- }while( size/= 10 );
- for(; *s ; *p++= *s++ );
- *p++= ' ';
- do{
- *--s= (time&7)+'0';
- }while( size>>=3 );
- while( *p++= *s++ );
- for(; p < buf+128 ; *p++= '\0' );
- }
-
- /*
- get file name from first data.
- */
- GetFilePacket( data, name, size )
- unsigned char *data,
- *name;
- unsigned int *size;
- {
- unsigned int i;
- while( *name++= *data++ );
- #if 0
- ConsoleOpen();
- ConsolePrint( data );
- ConsolePrint( "\r\n" );
- #endif
- for( i= 0 ; *data != ' ' ;){
- i*= 10;
- i+= *data++ & 15;
- }
- *size= i;
- for( i= 0, data++ ; *data && *data != ' ' ;){
- i<<= 3;
- i+= *data++ & 7;
- }
- #if 0
- {
- char buf[256];
- sprintf( buf, "<sec=%d>\r\n", i );
- ConsolePrint( buf );
- }
- #endif
- return i; /* time stamp */
- }
-
-